var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
(function () {
    /**
     * function 函数声明
     */
    function sum0(x, y) {
        return x + y;
    }
    console.log(sum0(1, 2));
    function sum1(x, y) {
        return Number(x) + Number(y);
    }
    console.log(sum1(2, 3));
    /**
     * 函数表达式, 函数表达式是长这个样子的.
     * 注意: ts中的'=>'和Es6中的‘=>’意思是不一样的, ts中的‘=>’左边是参数, 括号括起来, 右边是返回值类型, Es6中的=> 是箭头函数, 表示的返回值.可以代替大扩号进行使用, 其具备了return的功能.
     */
    var mySum = function (x, y) {
        return x + y;
    };
    // 接口中的属性有四种: 
    //  1. 普通变量属性, 2. 可选属性‘?’ 3. 任意属性[propName:string]:any, 4. 只读属性 readonly, 这里的只读是, 只可以在对西那个初始化的时候, 对该属性进行赋值,不是对变量的初始化. 
    /**
     * 函数的声明和函数的使用, 函数从名称到函数的参数, 到函数的返回值, 到函数的调用.
     *
     */
    // 普通函数
    function fun1(name, age) {
        // 这里的name, age是必需传进来的
        return "name: " + name + ", age is " + age;
    }
    // 带省略值函数
    function fun2(name, age) {
        // 这里的name是必需, age不能是必需
        var result = age ? "name: " + name + ", age is " + age : "name: " + name;
        return result;
    }
    // 剩余参数函数
    function fun3(name, age) {
        var rest = [];
        for (var _i = 2; _i < arguments.length; _i++) {
            rest[_i - 2] = arguments[_i];
        }
        var result = age ? "name: " + name + ", age is " + age : "name: " + name;
        // 这里能把所有的rest参数都打印出来
        console.log('rest', rest);
        return result;
    }
    fun3('bob', 12, 1, 2, 3, [89, 90, '12']);
    /**
     * 重载: 方法名相同, 参数, 返回值不同的方法, 叫重载.
     */
    // function reverse(x: number): number;
    // function reverse(x: string): string;
    function reverse(x) {
        if (typeof x === 'number') {
            return Number(x.toString().split('').reverse().join(''));
        }
        else if (typeof x === 'string') {
            return x.split('').reverse().join('');
        }
    }
    console.log(reverse(12));
    console.log(reverse('21'));
    function isFish(animal) {
        // 这里就会报错了, 因为, 无法判断这里的animal是cat还是Fish, 所以会bc.  
        /**
         * 这里的代码会有问题的.
         */
        // if (typeof animal.swim === 'function') {
        //     // 如下的代码就不会有问题了
        //     return true;
        // }
        // 就是用断言的做法, 可以实现. 
        if (typeof animal.swim === 'function') {
            animal.swim();
            return true;
        }
        else {
            return false;
        }
        return false;
    }
    // 如果这里是鱼, 那么就会调用这个方法; 
    var fish = {
        name: 'fish',
        swim: function () {
            console.log('我是鱼, 我是鱼, 我是鱼');
        }
    };
    console.log(isFish(fish));
    // swim方法
    function swim(animal) {
        // 断言如果是Fish, 他就有swim()的方法. 
        animal.swim();
    }
    // 断言就是告诉编译器, 我知道自己在干什么, 不用你来判断. 
    // 对象继承了接口, 要完全实现她的普通变量和方法, 可选和任意的可以不用管. 
    var ApiError = /** @class */ (function (_super) {
        __extends(ApiError, _super);
        function ApiError() {
            var _this = _super !== null && _super.apply(this, arguments) || this;
            _this.code = 0;
            return _this;
        }
        return ApiError;
    }(Error));
    var HttpError = /** @class */ (function (_super) {
        __extends(HttpError, _super);
        function HttpError() {
            var _this = _super !== null && _super.apply(this, arguments) || this;
            _this.code = 500;
            return _this;
        }
        return HttpError;
    }(Error));
    // 白瞎了, 初始化codeNumber没啥用. 
    function isApiError(error) {
        if (typeof error.code === 'number') {
            return true;
        }
        return false;
    }
})();
